#!/usr/bin/env python
# -*- coding:utf-8 -*-

def auth(func):
    def inner():
        print "before"
        func()    # func是参数，此时 func 等于 f1
        print "afeter"
    return inner   # 返回的 inner，inner代表的是函数，非执行函数

#ret1=auth(f1)  auth是返回一个函数inner内存地址(auth=inner)，但没有执行，加上（f1）才是执行，把f1传入inner，执行ineer（）；
#f1=ret1  ==> f1=auth(f1)  ==>f1=inner(f1)
#python自带语法糖 @函数名
@auth    #等价于auth(f1) @auth ==> f1=auth(f1)
def f1():
    print "f1"

'''
执行顺序：
1、auth(）读到内存
2、f1读到内存
3、调取f1()，才执行auth（）

def auth_arg(func):
    def inner(arg):
        print "before"
        func(arg)
        print "after"
    return inner
@auth_arg
def f2(arg):
    print "f5",arg
###################################
def auth_arg(func):
    def inner(*arg,**kwargs):
        print "before"
        func(*arg,**kwargs)
        print "after"
    return inner
@auth_arg
def f2(a1,a2):
    print "f5",a1,a2

@auth_arg
def f3():
    print "f3"

    ######################
    '''
def auth(func):
    def inner():
        print "before"
        temp = func()    # func是参数，此时 func 等于 f1
        print "afeter"
        return temp
    return inner   # 返回的 inner，inner代表的是函数，非执行函数

@auth
def fetch_server():
    server_list=['c1','c2','c3']
    return server_list
